package com.lgl.scs.userIndex.service;

import com.lgl.scsapi.base.dao.DaoSupport;
import com.lgl.scsapi.system.model.AppUser;
import com.lgl.scsapi.system.model.PageData;
import com.lgl.scsapi.util.utils.Constants;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;

@Service("appUserService")
public class AppUserService {
	@Resource(name = "daoSupport")
	private DaoSupport dao;
	@Resource
	private RedisTemplate redisTemplate;
	@Resource
	private StringRedisTemplate stringRedisTemplate;

	/**
	 * 通过用户名和密码查找用户
	 * @param pd 用户名和密码参数
	 * @return 查找到的用户
	 */
	public AppUser findByNameAndPassword(PageData pd) {
		return (AppUser) dao.findForObject("AppUserMapper.findByNameAndPassword", pd);
	}

	/**
	 * 保存用户
	 * @param pd 要保存的用户参数
	 * @return 影响的行数
	 */
	public int saveAppUser(PageData pd) {
		return dao.save("AppUserMapper.saveAppUser", pd);
	}

	/**
	 * 通过手机号查找用户
	 * @param pd 含手机号参数的PageData
	 * @return 查找到的AppUser对象
	 */
	public AppUser findByMobile(PageData pd) {
		return (AppUser) dao.findForObject("AppUserMapper.findByMobile", pd);
	}

	/**
	 * 获取当前登录用户其它信息
	 * @param pd 查询参数
	 * @return 查找到的用户其它信息
	 */
	public PageData getMyOtherInfoByName(PageData pd) {
		return (PageData) dao.findForObject("AppUserMapper.getMyOtherInfoByName", pd);
	}

	/**
	 * 编辑用户信息
	 * @param pd 用户要修改的参数
	 * @return 影响的行数
	 */
	public int editMyOtherInfo(PageData pd) {
		return dao.update("AppUserMapper.editMyOtherInfo", pd);
	}

	/**
	 * 判断手机号是否已存在
	 * @param userPhone 手机号参数
	 * @return true:存在，false:不存在
	 */
	public boolean isExistsPhone(String userPhone){
		if (!StringUtils.hasText(userPhone)){
			return false;
		}
		PageData phonePd = (PageData)dao.findForObject("AppUserMapper.isExistsPhone", userPhone);
		return phonePd != null && !phonePd.isEmpty();
	}

	/**
	 * 通过验证码修改密码
	 * @param myPhone 手机号
	 * @param newPwd 新密码
	 * @param checkCode 验证码
	 * @return 修改的成功/失败状态
	 */
	public PageData modifyPwdByCheckCode(String myPhone,String newPwd,String checkCode){
		PageData modifyPwdPd = new PageData(3);
		if (!StringUtils.hasText(myPhone) || !StringUtils.hasText(newPwd)) {
			modifyPwdPd.put("status", !StringUtils.hasText(myPhone) ? "3" : "4");
			return modifyPwdPd;
		}
		if (!StringUtils.hasText(checkCode)) {
			modifyPwdPd.put("status", "2");
			return modifyPwdPd;
		}
		String phoneKey = Constants.PHONE_CHECK_CODE_K_PRE + myPhone;
		//从redis中取验证码，并与传过来的比较
		String redisCheckCode = stringRedisTemplate.opsForValue().get(phoneKey);
		if (!checkCode.equals(redisCheckCode)) {
			modifyPwdPd.put("status", "5");
			return modifyPwdPd;
		}
		newPwd = new SimpleHash(Constants.ALGORITHM_NAME,newPwd,Constants.SHIRO_SALT,Constants.HASH_ITERATIONS).toHex();
		modifyPwdPd.put("newPwd", newPwd);
		modifyPwdPd.put("wherePhone", myPhone);
		editMyOtherInfo(modifyPwdPd);
		redisTemplate.delete(phoneKey);
		modifyPwdPd.clear();
		modifyPwdPd.put("status", "0");
		return modifyPwdPd;
	}

	/**
	 * 修改我的手机号
	 * @param appUser 登录用户
	 * @param userNewPhone 新手机号
	 * @param checkCode 验证码
	 * @return 校验、成功、失败码
	 */
	public String modifyMyPhone(AppUser appUser,String userNewPhone,String checkCode){
		if (appUser == null){
			return "3";
		}
		if (!StringUtils.hasText(userNewPhone)) {
			return "6";
		}
		if (!StringUtils.hasText(checkCode)) {
			return "4";
		}
		//如果新手机号=原手机号
		if (userNewPhone.equals(appUser.getPhone())) {
			return "7";
		}
		String redisCheckCode = stringRedisTemplate.opsForValue().get(Constants.PHONE_CHECK_CODE_K_PRE + appUser.getPhone());
		if (!checkCode.equals(redisCheckCode)) {
			return "5";
		}
		boolean isExistsNewPhone = isExistsPhone(userNewPhone);
		if (isExistsNewPhone){
			return "2";
		}
		PageData modifyPhonePd = new PageData(4);
		modifyPhonePd.put("EDIT_USERNAME", userNewPhone);
		modifyPhonePd.put("PHONE",userNewPhone);
		modifyPhonePd.put("USERNAME", appUser.getUserName());
		int row = editMyOtherInfo(modifyPhonePd);
		return row > 0 ? "0" : "2";
	}
}